<?php
App::uses('AppController', 'Controller');

/**
 * Controlador de Depreciação de Bens Patrimoniais
 *
 * @property BemPatrimonial $BemPatrimonial
 */
class DepreciacaosController extends AppController {
	
	public $uses = array('BemPatrimonial', 'HistoricoFinanceiro', 'ResumoFinanceiro');
	
/**
 * index method
 *
 * @return void
 */
	public function index() {
		$unidades = $this->BemPatrimonial->Unidade->find('list');
		$contas = $this->BemPatrimonial->Produto->Grupo->ContaContabil->find('list');
		$this->set(compact('unidades', 'contas'));
	}
	
/**
 * add method
 *
 * @return void
 */
	public function add() {
		
		if ($this->request->is('post')) {
			
			$mes = $this->request->data['Depreciacao']['mes'];
			$ano = $this->request->data['Depreciacao']['ano'];
			$ultimoDia = date('t', mktime(0, 0, 0, $mes, 1, $ano));
			
			$this->BemPatrimonial->recursive = 0;
			$bensPatrimoniais = $this->BemPatrimonial->find('all', array(
					'conditions' => array(
							'BemPatrimonial.data_inventario IS NOT NULL',
							'BemPatrimonial.data_utilizacao IS NOT NULL',
							'BemPatrimonial.data_aquisicao <= ' => $ano . '-' . str_pad($mes, 2, '0', STR_PAD_LEFT) . '-' . $ultimoDia,
							'OR' => array(
									'BemPatrimonial.data_baixa is NULL',
									'AND' => array(
											'EXTRACT(MONTH FROM "BemPatrimonial"."data_baixa")' => $mes,
											'EXTRACT(YEAR FROM "BemPatrimonial"."data_baixa")' => $ano
									)
							)
					)
				)
			);
			
			if (!empty($bensPatrimoniais)) {
				
				try {
					$rowsAffected = 0;
					
					$this->BemPatrimonial->begin();
					foreach ($bensPatrimoniais as $i => $bem) {
						if ($this->_depereciarBemPatrimonial($bem, $mes, $ano))
							$rowsAffected++;
					}
					
					$this->_gerarResumoFinanceiro($mes, $ano);
					$this->Session->setFlash('O Processo de depreciação foi executado para ' . $rowsAffected . ' bem(ns) patrimonial(is).');
					$this->BemPatrimonial->commit();
					
				} catch (Exception $e) {
					$this->BemPatrimonial->rollback();
					$this->Session->setFlash($e->getMessage());
				}	
				
			} else {
				$this->Session->setFlash('Não foram encontrados bens patriminiais aptos para o cálculo de depreciação');
			}
			
		}
		
		$contas = $this->BemPatrimonial->Produto->Grupo->ContaContabil->find('list');
		$meses = array('1' => 'Janeiro', '2' => 'Fevereiro', '3' => 'Março', '4' => 'Abril', '5' => 'Maio', '6' => 'Junho', '7' => 'Julho', '8' => 'Agosto', '9' => 'Setembro', '10' => 'Outubro', '11' => 'Novembro', '12' => 'Dezembro');
		$anos = array('2010' => 2010, '2011' => 2011, '2012' => 2012, '2013' => 2013);
		$this->set(compact('meses', 'anos', 'contas'));
	}
	
	
/**
 * 
 * Enter description here ...
 * @param array $bemPatrimonial Model BemPatrimonial
 * @param integer $mes
 * @param integer $ano
 * @throws Exception
 * @return boolean
 * @access protected
 */
	protected function _depereciarBemPatrimonial($bemPatrimonial, $mes, $ano)
	{
		try
		{
			// Verifica se o bem patrimonial possui data de aquisição
			if (empty($bemPatrimonial['BemPatrimonial']['data_aquisicao'])) {
				throw new NotFoundException('O bem patrimonial ID:' . $id . ' não possui data de aquisição.');
			}
			
			if (empty($bemPatrimonial['BemPatrimonial']['data_utilizacao'])) {
				throw new NotFoundException('O bem patrimonial ID:' . $id . ' não possui data de utilização.');
			}
			
			if (empty($bemPatrimonial['BemPatrimonial']['vida_util'])) {
				throw new NotFoundException('O bem patrimonial ID:' . $id . ' não possui vida útil cadastrada.');
			}
			
			// Vida útil do bem em meses
			$mesesVidaUtil = $bemPatrimonial['BemPatrimonial']['vida_util'] * 12;
			
			$dateAquisicao = new DateTime($bemPatrimonial['BemPatrimonial']['data_aquisicao']);
			$dateBaseCalculo = new DateTime($ano . '-' . str_pad($mes, 2, '0', STR_PAD_LEFT) . '-' . date('t', mktime(0, 0, 0, $mes, 1, $ano)));
			$diffDates = $dateAquisicao->diff($dateBaseCalculo);

			// Deprecia somente aqueles bens que ainda não extrapolaram o tempo de vida útil e que tem mais de 30 dias de uso
			if (($diffDates->m <= $mesesVidaUtil) && ($dateBaseCalculo->getTimestamp() > strtotime('+30 day', strtotime($bemPatrimonial['BemPatrimonial']['data_utilizacao'])))) 
			{
				// Cadastra valores no histórico de valores do bem patrimonial
				$historicoFinanceiro = array(
					'bem_patrimonial_id' => $bemPatrimonial['BemPatrimonial']['id'],
					'mes_depreciacao' => $bemPatrimonial['BemPatrimonial']['mes_depreciacao'],
					'ano_depreciacao' => $bemPatrimonial['BemPatrimonial']['ano_depreciacao'],
					'valor_nominal' => $bemPatrimonial['BemPatrimonial']['valor_nominal'],
					'valor_corrigido' => $bemPatrimonial['BemPatrimonial']['valor_corrigido'],
					'percentual_residual' => $bemPatrimonial['BemPatrimonial']['percentual_residual'],
					'valor_residual' => $bemPatrimonial['BemPatrimonial']['valor_residual'],
					'valor_depreciavel' => $bemPatrimonial['BemPatrimonial']['valor_depreciavel'],
					'valor_depreciacao_mes' => $bemPatrimonial['BemPatrimonial']['valor_depreciacao_mes'],
					'valor_depreciacao_acumulada' => $bemPatrimonial['BemPatrimonial']['valor_depreciacao_acumulada'],
					'datainc' => date('Y-m-d')
				);
				
				$this->HistoricoFinanceiro->create();
				if ($this->HistoricoFinanceiro->save(array('HistoricoFinanceiro' => $historicoFinanceiro)))
				{	
					switch ($bemPatrimonial['BemPatrimonial']['tipo_bem'])
					{
						case 'M':
							
							$valorDepreciacaoMes = $bemPatrimonial['BemPatrimonial']['valor_depreciavel'] / $mesesVidaUtil;
							$bemPatrimonial = array_merge($bemPatrimonial['BemPatrimonial'], array(
									'mes_depreciacao' => $mes,
									'ano_depreciacao' => $ano,
									'valor_depreciacao_mes' => $valorDepreciacaoMes,
									'valor_depreciacao_acumulada' => $bemPatrimonial['BemPatrimonial']['valor_depreciacao_acumulada'] + $valorDepreciacaoMes,
									'valor_corrigido' => $bemPatrimonial['BemPatrimonial']['valor_corrigido'] - $valorDepreciacaoMes,
									'dataalt' => date('Y-m-d H:i:s'),
									'data_correcao' => date('Y-m-d')
								)
							);
							$this->BemPatrimonial->save(array('BemPatrimonial' => $bemPatrimonial));
							
							break;
						
						case 'I';
							break;
					}
					
					return true;
				}
				
			}
			
		} catch(Exception $e) {
			throw new Exception("O Cálculo da depreciação não foi concluído. ".$e->getMessage());
		}
		
		return false;
	}
	
	
	
	protected function _gerarResumoFinanceiro($mes, $ano)
	{
		
		$ultimoDiaMes = date('t', mktime(0, 0, 0, $mes, 1, $ano));
		// and ("BemPatrimonial"."data_baixa" is NULL or (EXTRACT(MONTH FROM "BemPatrimonial"."data_baixa") = ' . $mes . ' and EXTRACT(YEAR FROM "BemPatrimonial"."data_baixa") = ' . $ano . '))
		$bensPatrimoniais = $this->BemPatrimonial->query('Select "Grupo"."id" as "Grupo__id", "Grupo"."grupo" as "Grupo__grupo", 
				SUM("BemPatrimonial"."valor_corrigido") AS "BemPatrimonial__valor_corrigido", SUM("BemPatrimonial"."valor_depreciacao_mes") AS "BemPatrimonial__valor_depreciacao_mes", 
				SUM("BemPatrimonial"."valor_depreciacao_acumulada") AS "BemPatrimonial__valor_depreciacao_acumulada", SUM("BemPatrimonial"."valor_aquisicao") AS "BemPatrimonial__valor_aquisicao"
			from "bem_patrimonials" as "BemPatrimonial" 
			inner join "produtos" as  "Produto" on "BemPatrimonial"."produto_id" = "Produto"."id" 
			inner join "grupos" as "Grupo" on "Produto"."grupo_id" = "Grupo"."id"
			where "BemPatrimonial"."data_inventario" IS NOT NULL and "BemPatrimonial"."data_utilizacao" IS NOT NULL and "BemPatrimonial"."data_aquisicao" <= \'' . $ano . '-' . str_pad($mes, 2, '0', STR_PAD_LEFT) . '-' . $ultimoDiaMes . '\'
				and "BemPatrimonial"."mes_depreciacao" = ' . $mes . ' and "BemPatrimonial"."ano_depreciacao" = ' . $ano . '
			group by "Grupo"."id", "Grupo"."grupo"
			order by "Grupo"."id" asc');
		
		if (!empty($bensPatrimoniais)) {
			foreach ($bensPatrimoniais as $i => $consolidado) {
				try {
					$this->ResumoFinanceiro->create();
					$this->ResumoFinanceiro->save(array('ResumoFinanceiro' => array(
								'mes' => $mes,
								'ano' => $ano,
								'grupo_id' => $consolidado['Grupo']['id'],
								'valor_aquisicao' => $consolidado['BemPatrimonial']['valor_aquisicao'],
								'valor_corrigido' => $consolidado['BemPatrimonial']['valor_corrigido'],
								'valor_depreciacao_mes' => $consolidado['BemPatrimonial']['valor_depreciacao_mes'],
								'valor_depreciacao_acumulada' => $consolidado['BemPatrimonial']['valor_depreciacao_acumulada'],
								'datainc' => date('Y-m-d H:i:s')
							)
						)
					);
				} catch (Exception $e) {
					throw $e;
				}
			}
		}
		
		return true;
	}
	
}